package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/hex"
	"fmt"
	"io"
	"strings"
)

// 共享锁（对称加密）：一把钥匙开一把锁
// 给数据加密（像给文件装密码锁）
func encrypt(data, key []byte) (string, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}
	iv := make([]byte, aes.BlockSize) // 随机“初始码”，让锁更安全
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		return "", err
	}
	stream := cipher.NewCTR(block, iv)
	stream.XORKeyStream(data, data)
	// 将IV和密文一起返回，用冒号分隔
	return fmt.Sprintf("%x:%x", iv, data), nil
}

// 解密数据（像用钥匙打开密码锁）
func decrypt(encrypted string, key []byte) (string, error) {
	// 1. 分割IV和密文
	parts := strings.Split(encrypted, ":")
	if len(parts) != 2 {
		return "", fmt.Errorf("无效的加密字符串格式")
	}

	// 2. 解码IV和密文（从十六进制字符串解码回字节）
	iv, err := hex.DecodeString(parts[0])
	if err != nil {
		return "", err
	}
	cipherText, err := hex.DecodeString(parts[1])
	if err != nil {
		return "", err
	}

	// 3. 创建AES解密器
	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}

	// 4. 使用CTR模式解密
	stream := cipher.NewCTR(block, iv)
	stream.XORKeyStream(cipherText, cipherText) // 解密结果直接覆盖密文字节切片

	// 5. 将解密后的字节转换为字符串并返回
	return string(cipherText), nil
}

func main() {
	key := []byte("abcdefgh12345678") // 16位“钥匙”（AES-128）
	originalData := "我的银行卡号：622202888888881234"

	fmt.Println("原始数据：", originalData)

	// --- 加密过程 ---
	encrypted, err := encrypt([]byte(originalData), key)
	if err != nil {
		fmt.Printf("加密失败: %v\n", err)
		return
	}
	fmt.Println("加密后（别人看不懂）：", encrypted)

	// --- 解密过程 ---
	decrypted, err := decrypt(encrypted, key)
	if err != nil {
		fmt.Printf("解密失败: %v\n", err)
		return
	}
	fmt.Println("解密后（恢复原样）：", decrypted)
}
